// 加载建筑
function createBuilds (viewer) {
  // 加载模型
  // scene: Cesium虚拟场景中所有3D图形对象和状态的容器
  // primitives: 获取基元的集合
  const tileset = viewer.scene.primitives.add(
    // Cesium3DTileset: 用于流式传输大量异构3D地理空间数据集
    new Cesium.Cesium3DTileset({
      // 获取ION上的资源，加载到地图
      url: Cesium.IonResource.fromAssetId(1619864)
    })
  )
  // 异步设置摄像机以查看提供的一个或多个实体或数据源
  // viewer.zoomTo(tileset)

  // 设置模型样式
  // 应用于 Cesium3DTileset 的样式。
  tileset.style = new Cesium.Cesium3DTileStyle({
    color: {
      // conditions: [
      //   ["${Floor} > 20", "color('blue')"],
      //   ["${Floor} > 15", "color('green')"],
      //   ["${Floor} > 10", "color('yellow')"],
      //   ["${Floor} > 5", "color('red')"],
      //   ["true", "color('orange')"],
      // ],
      conditions: [["true", "color('rgb(51, 153, 255)', 1)"]]
    }
  })
  // 加载自定义shader
  setBuildShader(tileset)
  return tileset
}

// 设置建筑自定义shader
function setBuildShader (tileset) {
  tileset.enableModelExperimental = true
  tileset.customShader = new Cesium.CustomShader({
    uniforms: { // 设置shader中的变量
      u_envTexture: {
        value: new Cesium.TextureUniform({
          url: "./static/images/sky.jpg"
        }),
        type: Cesium.UniformType.SAMPLER_2D
      },
      u_envTexture2: {
        value: new Cesium.TextureUniform({
            url: "./static/images/pic.jpg"
        }),
        type: Cesium.UniformType.SAMPLER_2D
      }
    },
    mode: Cesium.CustomShaderMode.REPLACE_MATERIAL,
    lightingModel: Cesium.LightingModel.UNLIT,
    // 定义片元着色器
    fragmentShaderText: `
      void fragmentMain(FragmentInput fsInput,inout czm_modelMaterial material) {
        // 表示当前片元在模型坐标系下的位置
        vec3 positionMC = fsInput.attributes.positionMC;
        // 表示当前片元在眼睛坐标系下的位置
        vec3 positionEC = fsInput.attributes.positionEC;
        // 表示当前片元在眼睛坐标系下的位置
        vec3 normalEC = fsInput.attributes.normalEC;
        vec3 posToCamera = normalize(-positionEC); 
        vec3 coord = normalize(vec3(czm_inverseViewRotation * reflect(posToCamera, normalEC)));
        float ambientCoefficient = 0.3;
        float diffuseCoefficient = max(0.0, dot(normalEC, czm_sunDirectionEC) * 1.0);
        // dark
        vec4 darkRefColor = texture(u_envTexture2, vec2(coord.x, (coord.z - coord.y) / 2.0));
        material.diffuse = mix(mix(vec3(0.3), vec3(0.1,0.2,0.4),clamp(positionMC.z / 200., 0.0, 1.0)) , darkRefColor.rgb ,0.3);
        material.diffuse *= 0.2;
        // 注意shader中写浮点数是 一定要带小数点 否则会报错 比如0需要写成0.0 1要写成1.0
        float _baseHeight = 0.0; // 物体的基础高度，需要修改成一个合适的建筑基础高度
        float _heightRange = 20.0; // 高亮的范围(_baseHeight ~ _baseHeight + _heightRange)
        float _glowRange = 300.0; // 光环的移动范围(高度)
        // 建筑基础色
        float czm_height = positionMC.y - _baseHeight;
        float czm_a11 = fract(czm_frameNumber / 120.0) * 3.14159265 * 2.0;
        float czm_a12 = czm_height / _heightRange + sin(czm_a11) * 0.1;

        float times = czm_frameNumber / 60.0;
        material.diffuse *= vec3(czm_a12);// 渐变
        // 动态光环
        float time = fract(czm_frameNumber / 360.0);
        time = abs(time - 0.5) * 2.0;
        float czm_h = clamp(czm_height / _glowRange, 0.0, 1.0);
        float czm_diff = step(0.005, abs(czm_h - time));
        material.diffuse += material.diffuse * (1.0 - czm_diff);
        material.alpha = 1.0;
    } 
  `
  })
}